第4节 流程控制语句

前言

  1. 调试代码,找出代码中的问题经常使用 debugger 来打断点, 而要能在准确位置打上断点, 就必须熟悉程序的执行流程
  2. 流程控制语句有三种: 顺序结构, 分支结构和循环结构

(一) 顺序结构(默认)

  1. 程序默认从上到下一句一句代码执行, 这就是顺序结构
  2. 若是某一行代码出现了错误, 则后面的代码无法执行
<script> 
    console.log(1);
    console.log(2);
    console.log(3);
    console.log(a);
    console.log(4);
    console.log(5);
    console.log(6);
    debugger;
    console.log(7);
    console.log(8);
</script>
    
<script> 
    console.log(1);
    console.log(2);
    console.log(3);
    console.log(a);
    console.log(4);
    console.log(5);
    console.log(6);
	// 上面打印了一个没有声明的变量, 所以出错了, 程序终止运行, 不会停在这里
    debugger;
    console.log(7);
    console.log(8);
</script>

(二) 分支结构

1. if else

if(条件) {
  // 条件为true执行这里的代码  
} else {
  // 条件为false执行这里的代码
}

2. 三目运算符

<!-- demo1 -->
<script>
    // 是否登录
    var isLogin = false;
    var text = '';
    // if (isLogin) {
    //     text = '138****0000';
    // } else {
    //     text = '立即登录';
    // }

    // 以上分支语句可以使用三目运算代替,会更简洁
    text = isLogin?'138****000':'立即登录';
    console.log('text',text); 
</script>
    
<!-- demo2 -->    
<script>
    var str = prompt('请输入');
    var gender = str === '1' ? '男人' : '女人';
    alert(gender);
</script>    

3. switch

多重判断的分支结构, 主要用于多种一一对应的情况, 判断条件通常只有一个变量

<script>
   var city = prompt('请输入城市简写');

   switch(city) {
        case 'sz':
            alert('你选择了深圳'); 
            break;
        case 'gz':
            alert('你选择了广州');
            break;
        case 'sh':
            alert('你选择了上海');
            break;
        case 'bj':
            alert('你选择了北京'); 
            break;
        default:
            alert('该城市不存在');     
   } 
</script>

练习:

练习1: 
var month = prompt();
var day = prompt();
// 若用户输入为个位数, 请将其变为2两位数, 最后打印出来
month = month<10?'0'+month:month;
console.log('month:', month);

day = day<10?'0'+day:day;
console.log('day:', day); 
练习2: 麦当劳的饮料机有四个按钮, 按钮1得到橙汁,按钮2得到牛奶, 按钮3得到啤酒, 按钮4得到咖啡, 
请编写一个程序, 弹出一个窗口, 用户输入的的数字不同, 弹出不同的饮料.
// 注意: 页面输入的内容都是字符串
// Switch进行比较用的是===, 也就是类型要相同, 值也要相同    
<script>
     var num = prompt('请输入数字');
     num = Number(num); 
    switch(num) {
        case 1:
            alert('橙汁');
            break;
        case 2:
            alert('牛奶');
            break;
        case 3:
            alert('啤酒');
            break;
        default:
            alert('咖啡'); 
    } 
</script>    
    

(三) 循环结构

01 标准 for 循环四部分

(1)循环变量初始值 var i = 0; (2)循环条件 i<3; (3)改变循环条件 i++ (4)循环体 {...}内的代码就是循环体

循环运行规律:

  • 第一轮 先执行第一部分, 再执行第二部分, 然后执行第四部分, 最后执行第三部分, 简称1243

  • 第二轮开始 先执行第二部分(第一部不再执行), 然后执行第四部分, 最后执行第三部分,直到结束, 简称243

    <script>
        // 第1次 i=0 0<3=>true, 所以打印0
        // 第2次 i=1 1<3=>true, 所以打印1
        // 第3次 i=2 2<3=>true, 所以打印2
        // 第4次 i=3 3<3=>false, 终止循环
        for (var i = 0; i < 3; i++) { 
            console.log(i);
        }
    </script>
    

02 应用

1.应用demo

<!-- 计算1-10总和 -->
<script>
    var sum = 0;
   for(var i=1;i<=10;i++){ 
    sum = sum + i; 
   } 
   console.log('sum=',sum); 
</script>
    
    
<!-- 在页面上显示10"我爱web前端" -->
<script> 
    var str = '';
    for(var i=0;i<10;i++) {
        str = str + '<li>我爱web前端</li>';
        console.log(str); 
    }
    document.write('<ul>');
    document.write(str);
    document.write('</ul>');
</script>     

2. 练习:

  1. 练习1: 计算1~100的和并输出到页面上

  2. 练习2: 使用for循环在网页上打印一个ul列表,列表有5个li,li的内容任意

    进阶: 给li内容添加序号(从1开始);

    <script> 
         var str = '';
         for(var i=0;i<5;i++){
            str +=  `<li>${i+1}.xxxxxxxx</li>`;
         }
         document.write(str);
    </script>
    

    2. continue 和 break

    • for循环添加continue, continue后面的语句不再执行, 直接进入下一次循环
    • for循环添加break后, 当符合break条件, 退出循环
    <!-- continue -->
    <script>  
         for(var i=0;i<10;i++){
            if (i===5) {
                continue;
            }; 
             console.log(i);
         } 
    </script>
        
    <!-- break -->
    <script>  
         for(var i=0;i<10;i++){
            if (i===5) {
               break;
            }; 
             console.log(i);
         } 
    </script>    
    
    练习: 
    运算并在网页上打印结果
    有一篮苹果,两个两个的拿剩一个,三个三个的拿剩一个,四个四个的拿剩一个,五个五个的拿剩一个,六个六个的拿剩一个,七个七个的拿,能拿完,请问这篮子里至少有多少个苹果?
        
    <script>
        for (var i = 0; i < 10000; i++) {
            if (i % 2 === 1 && i % 3 === 1 && i % 4 === 1 && i % 5 === 1 && i % 6 === 1 && i % 7 === 0) {
                alert(`至少有${i}个苹果`);
                break;
            }
        }
    </script>    
    

    3. 死循环

    1. 循环的四个部分并不是必须的

      // 缺少第一部分
      <script>
          var i=0;
          for(;i<5;i++) {
              console.log(i);
          }
      </script>
      
      // 缺少第一部分和第三部分    
      <script>
          var i=0;
          for(;i<5;) {
              console.log(i);
              i++;
          }
      </script> 
      
      // 缺少前三部分, 第四部分也可以缺少, 但是没有意义   
      <script> 
          for(;;) {
              console.log(222); 
          }
      </script>    
          
      
    2. 死循环就是循环条件永远满足条件导致循环用不终止, 直到关闭浏览器

      // 死循环
      <script> 
          for(;;) {
              console.log(222); 
          }
      </script> 
          
      // 上面的练习题,可以使用死循环
      <script>
          var i = 0;
          for (;;) {
              if (i % 2 === 1 &&
                  i % 3 === 1 &&
                  i % 4 === 1 &&
                  i % 5 === 1 &&
                  i % 6 === 1 &&
                  i % 7 === 0) {
                  alert(`至少有${i}个苹果`);
                  break;
              }
              i++
          }
      </script>    
      

03 while和do while

do while至少执行一次, 因为先执行后判断

 <script>
    var i = 0;
    while(i<10) {
        console.log(i);
        i++;
    }
</script>
    
<script>
    var i =11;
    do{
        console.log(i);
        i++;
    }while(i<10);
</script>    

04 for循坏进阶应用

  • 数组遍历
  • 对象遍历

for循坏进阶应用

1.将数组成员输出到页面上

成员为基本数据类型

<script>
    // 数组的循环
    var list = ['a','b','c','d','e'];
    var str = '';
    for(var i=0;i<list.length;i++) {
        console.log(list[i]);
        str += `<li>${list[i]}</li>`;
    } 
    document.write(str);
</script>

2.将数组成员输出到页面上

成员为引用类型

<script>
    // 数组的循环
    var list = [{
            username: '张三1',
            age: 18
        },
        {
            username: '张三2',
            age: 19
        },
        {
            username: '张三3',
            age: 20
        },
        {
            username: '张三4',
            age: 21
        },
        {
            username: '张三5',
            age: 22
        },
    ];
    var str = '';
    for (var i = 0; i < list.length; i++) { 
        str += `<li> 
            <span>用户名: ${list[i].username}</span> 
            <span>年龄: ${list[i].age}</span> </li>`;
    }
    document.write(str);
</script>

​ 练习: 把身边的成员数组输出到页面上, 样式自编

3.静态页面和动态数据结合

demo.html 静态文件

<!DOCTYPE html>
<html lang="en"> 
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport"
        content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
    <title>Document</title>
   <link rel="stylesheet" href="./demo.css">
</head>

<body>
    <div class="top">
        <p class="item">
            <img src="http://static.huruqing.cn/fresh/banner3.jpeg" alt="">
            <span>时令鲜果</span>
        </p> 
        <p class="item">
            <img src="http://static.huruqing.cn/fresh/banner3.jpeg" alt="">
            <span>时令鲜果</span>
        </p> 
        <p class="item">
            <img src="http://static.huruqing.cn/fresh/banner3.jpeg" alt="">
            <span>时令鲜果</span>
        </p> 
        <p class="item">
            <img src="http://static.huruqing.cn/fresh/banner3.jpeg" alt="">
            <span>时令鲜果</span>
        </p> 
        <p class="item">
            <img src="http://static.huruqing.cn/fresh/banner3.jpeg" alt="">
            <span>时令鲜果</span>
        </p> 
        <p class="item fix"></p>
        <p class="item fix"></p>
        <p class="item fix"></p>
        <p class="item fix"></p>
        <p class="item fix"></p>
    </div> 

    <script src="./demo.js"> </script>
</body> 
</html>

demo.css

* {
    margin: 0;
    padding: 0;
}

body {
    background-color: #f4f4f4;
}

.top {
   
    background-color: #fff;
    display: flex;
    justify-content: space-around;
    align-items: center;
    flex-wrap: wrap;
    align-content: flex-start;
}

.top .item {
    width: 22%;
    height: 94px; 
    display: flex;
    flex-direction: column;
    justify-content: space-around;
    align-items: center; 
}

.top img {
    width: 45px;
    height: 45px;

}
.top .fix { 
    height: 0;
}

demo.js

var list = [ { categoryId: 145, name: "时令鲜果", iconUrl: "http://static.huruqing.cn/fresh/r1.png", }, { categoryId: 243, name: "海鲜水产", iconUrl: "http://static.huruqing.cn/fresh/r2.png", }, { categoryId: 279, name: "家禽蛋", iconUrl: "http://static.huruqing.cn/fresh/r3.png", }, { categoryId: 346, name: "地方农产", iconUrl: "http://static.huruqing.cn/fresh/r4.png", }, { categoryId: 436, name: "百果园公司", iconUrl: "http://static.huruqing.cn/fresh/r5.png", }, { categoryId: 357, name: "农品茗茶", iconUrl: "http://static.huruqing.cn/fresh/r6.png", }, { categoryId: 6, name: "五谷杂粮", iconUrl: "http://static.huruqing.cn/fresh/r7.png", }, { categoryId: 311, name: "牛羊肉", iconUrl: "http://static.huruqing.cn/fresh/r8.png", }, ];
var str = "";
for (var i = 0; i < list.length; i++) {
  str += ` <p class="item">
    <img src="${list[i].iconUrl}" alt="">
    <span>${list[i].name}</span>
</p> `;
}

var $top = document.querySelector(".top");
$top.innerHTML = str;

05 对象循环

<script>
    var obj = {
        name: '张三',
        age: 18,
        addr: '广东深圳',
        hobby: '篮球,足球,羽毛球'
    }

    for(var p in obj){
        console.log(p+'='+obj[p]); 
    } 
</script>

(四) 作业

  1. 判断今天是星期几

    使用Switch语句, 在页面上输出今天是星期几, 比如: 今天是星期四就在页面上显示"今天是星期四"

    // 下面这行代码可以获得星期对应的数字,如果今天是星期四,则day的值为4 
    
    
  2. 渲染电影列表和影院列表

    电影列表数据: http://81.71.65.4:3008/film/list?type=3
    
    
    影院列表数据: http://81.71.65.4:3008/cinema/list?cityName=%E6%B7%B1%E5%9C%B3
    
  3. 二维数组(附加题)

    当数组的成员也是数组时, 我们把这个数组称为二维数组, 有以下二维数组, 计算所有所有成员总和

    var list = [
    [1,3,5],
    [2,4,6],
    [3,6,9]
    ]
        
    
    
  4. 生成乘法表(附加题)

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <style>
            .num { 
                margin-left: 5px;
            }
            .box {
                border: 1px solid #999;
            }
            .no {
                border: 1px solid greenyellow;
                background-color: greenyellow;
                display: inline-block;
                height: 20px;
                width: 20px;
                line-height: 20px;
                text-align: center;
                border-radius: 50%;
                font-size: 18px;
                margin-left: 10px;
            }
        </style>
    </head>
    
    <body>
        <pre>
            需求: 点击按钮生成乘法口诀表, 样式自理
        </pre> 
        <pre>
            ps: 使用双重for循环来实现
               外层for循环, i的取值从1-9
               内层for循环, j的取值从1-i
        </pre>
    
    
        <button>生成</button>
        <div class="box"> </div>
    
         
    </body>
    
    </html>